#pragma once

#ifndef LHJ_CORE_DB_TERMINAL_OILTRANS_H__
#define LHJ_CORE_DB_TERMINAL_OILTRANS_H__

#include <string>
#include <stdint.h>
#include <vector>
#include <model.h>

namespace cores
{   
    namespace database
    {
        namespace terminal
        {
            using OilTransaction = datas::models::terminal::OilTransaction;
            using SerialNumber = datas::models::terminal::SerialNumber;
            using LlqDataItem = datas::models::terminal::LlqDataItem;

            class OilTrans
            {
            public:
                /**
                 * @brief 析构函数
                 */
                virtual ~OilTrans();               

                /**
                 * @brief 获取待上传数据列表
                 */
                static std::vector<OilTransaction> getRawTransDataS(const bool &is_test = false);

                /**
                 * @brief 新增一条交易数据
                 */
                static void addOneTransDataS(const OilTransaction &trans_item);

                /**
                 * @brief 新增一条交易数据，并更新序号
                 */
                static void addOneTransDataS(const OilTransaction &trans_item, const uint16_t &serial_num);

                /**
                 * @brief 更新数据上传状态
                 */
                static void updateTransDataStatusS(const std::vector<std::string> &ids, const bool &is_upload = true);

                /**
                 * @brief 获取所有设备的流水号
                 */
                static std::vector<SerialNumber> getSerialNumberDataS();

                /**
                 * @brief 依据Lora ID和枪号获取设备流水号
                 */
                static std::vector<SerialNumber> getSerialNumberDataS(const uint16_t &lora_id, const uint8_t &nozzle_code);

                /**
                 * @brief 添加新的流水号
                 */
                static void addSerialNumberRecordS(const SerialNumber& item);

                /**
                 * @brief 更新流水号
                 */
                static void updateSerialNumberRecordS(const SerialNumber& item);

                /**
                 * @brief 获取待上传的液位仪数据
                 */
                static std::vector<LlqDataItem> getNoUploadLlqDataS(const bool &is_test = false);

                /**
                 * @brief 添加新的液位仪数据
                 */
                static void addNewLlqDataS(const LlqDataItem &item);

                /**
                 * @brief 更新液位仪数据状态数据
                 */
                static void updateLlqDataStatusS(const std::vector<std::string> &ids, const bool &is_upload = true);

            protected:
                /**
                 * @brief 获取待上传数据列表
                 */
                virtual std::vector<OilTransaction> getRawTransData(const bool &is_test) = 0;

                /**
                 * @brief 新增一条交易数据
                 */
                virtual void addOneTransData(const OilTransaction &trans_item) = 0;

                /**
                 * @brief 新增一条交易数据
                 */
                virtual void addOneTransData(const OilTransaction &trans_item, const uint16_t &serial_num) = 0;

                /**
                 * @brief 更新数据上传状态
                 */
                virtual void updateTransDataStatus(const std::vector<std::string> &ids, const bool &is_upload) = 0;

                /**
                 * @brief 获取所有设备的流水号
                 */
                virtual std::vector<SerialNumber> getSerialNumberData() = 0;

                /**
                 * @brief 根据Lora ID和枪号获取设备流水号
                 */
                virtual std::vector<SerialNumber> getSerialNumberData(const uint16_t &lora_id, const uint8_t &nozzle_code) = 0;

                /**
                 * @brief 新增一条流水号数据
                 */
                virtual void addSerialNumberRecord(const SerialNumber& item) = 0;

                /**
                 * @brief 更新流水号
                 */
                virtual void updateSerialNumberRecord(const SerialNumber& item) = 0;

                /**
                 * @brief 获取没有上传的液位仪数据集
                 */
                virtual std::vector<LlqDataItem> getNoUploadLlqData(const bool &is_test) = 0;

                /**
                 * @brief 新增液位仪数据
                 */
                virtual void addNewLlqData(const LlqDataItem &item) = 0;

                /**
                 * @brief 更新数据上传状态
                 */
                virtual void updateLlqDataStatus(const std::vector<std::string> &ids, const bool &is_upload) = 0;

            protected:
                /**
                 * @brief 构造函数
                 */
                OilTrans();

            private:
                /**
                 * @brief 静态全局变量
                 */
                static OilTrans * globalInstance;
            };
        }
    }
}

#endif